﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpGuiMainFrameInterface.h"
#include "OwnerPtr.h"

#include <vector>

namespace gcmp
{
    class IRibbonQuickAccessBar;
    class IRibbonSystemButton;
    class IRibbonPage;
    class IControlDefinition;

    /// \brief Ribbon接口, Ribbon是用户界面的主要元素
    class GCMP_GUI_MAIN_FRAME_INTERFACE_EXPORT IRibbon
    {
    public:
        /// \brief 析构函数
        virtual ~IRibbon(void);

        /// \brief 添加页面至最后
        ///
        /// \param pPage    page对象
        /// \return   true表示成功；ribbon中存在与pPage的id相同的page时会返回false
        virtual bool AddPage(gcmp::OwnerPtr<IRibbonPage> pPage) = 0;

        /// \brief 插入page
        ///
        /// 插入pPage至Id为beforePageId的page的的前面
        /// \param beforePageId  被插入page的Id
        /// \param pPage    将插入的page对象
        /// \return true表示成功;ribbon中不存在id为beforePageId的page或存在与pPage的id相同的page时会返回false
        virtual bool InsertPage(const std::wstring& beforePageId, gcmp::OwnerPtr<IRibbonPage> pPage) = 0;

        /// \brief 删除page
        ///
        /// \param pageId   将删除page的Id
        /// \return true表示成功，false表示失败
        virtual bool DeletePage(const std::wstring& pageId) = 0; 

        /// \brief 删除所有page
        ///
        /// \return  true表示成功，false表示失败
        virtual bool DeleteAllPages() = 0;

        /// \brief 得到Ribbon上所有的page页面
        ///
        /// \return  page集合
        virtual std::vector<IRibbonPage*> GetAllPages() = 0;

        /// \brief 根据page的Id在Ribbon中找page对象
        ///
        /// \param   pageId page的Id,设置的唯一标识   
        /// \return  IRibbonPage对象,如果Ribbon中没有Id为pageId的page,则返回空指针
        virtual IRibbonPage* GetPage(const std::wstring& pageId) = 0;

        /// \brief 根据命令的Id查找执行该命令的父控件和子控件
        ///
        /// \param   strCommandId 当前执行的命令Id
        /// \return  std::pair<IControlDefinition*, IControlDefinition*> 正在执行该命令的父控件指针和子控件指针,如果不存在对应的控件则均返回空指针
        virtual std::pair<IControlDefinition*, IControlDefinition*> FindControlDefinitionByCommandId(const std::wstring &strCommandId) const = 0;

        /// \brief 设置需要保持高亮的控件
        /// 仅对已经高亮的控件生效，使用后，对应控件的高亮状态将不再刷新，当控件再无高亮需求时，需要传入空集置空
        /// \param   controlNames 控件绑定的命令Id集合
        /// \return  void
        virtual void SetCustomHighLightControl(const std::vector<std::wstring> &controlNames) = 0;

        /// \brief 得到当前的page
        ///
        /// \return  IRibbonPage对象,如果所有的Page都隐藏了，返回空指针
        virtual IRibbonPage* GetActivatedPage() = 0;  //return page对象
       
        /// \brief 激活Page为当前页
        /// 
        /// \param pageId  page的Id,设置的唯一标识
        /// \return true表示成功;如果Ribbon中不存在Id为pageId的page,则返回false，失败了当前page不变
        virtual bool ActivatePage(const std::wstring& pageId) = 0;        

        /// \brief 最小化Ribbon
        ///
        /// \return true表示成功，false表示失败
        virtual bool Minimize() = 0;

        /// \brief 最大化Ribbon
        ///
        /// \return  true表示成功，false表示失败
        virtual bool Maximize() = 0;

        /// \brief 得到左上方的快捷工具条对象
        ///
        /// \return 
        virtual IRibbonQuickAccessBar* GetLeftQuickAccessBar() = 0;

        /// \brief 得到右上方工具条对象
        ///
        /// \return 
        virtual IRibbonQuickAccessBar* GetRightQuickAccessBar() = 0;

        /// \brief 得到应用按钮对象
        ///
        /// \return 
        virtual IRibbonSystemButton* GetSystemButton() = 0;

        /// \brief 更新激活的Ribbon页面
        ///
        /// \return true表示成功，false表示失败
        virtual bool UpdateActivatePage() = 0;

        /// \brief 获取键盘提示功能是否开启
        ///
        /// \return true表示开启，false表示关闭
        virtual bool IsKeyTipsEnabled() const = 0;

        /// \brief 设置键盘提示功能开启或者关闭（默认关闭）
        /// 
        /// \return 注意：打开会存在bug，GBMP-8847连点alt崩溃
        virtual void EnableKeyTips(bool enable) = 0;

        /// \brief 显示RibbonBar
        /// 
        /// \return 
        virtual void Show() = 0;

        /// \brief 隐藏RibbonBar
        /// 
        /// \return 
        virtual void Hide() = 0;
    };
}


